package com.loveprogrammer.lowercode.dna.instance.bo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.loveprogrammer.lowercode.dna.def.Vd;
import lombok.Data;
import com.loveprogrammer.lowercode.dna.common.IdGenerator;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 具体存放具体领域信息的对象
 * 相当的与数据表中的一条数据，属性由vas来定义 每个va相当于是一个vd的key value
 */
@Data
public class Cell implements Cloneable{

    long id;
    long rootId;
    long parentId;
    // 操作标记， 新增 修改 删除 和 不变化
    String operationFlag;
    // 表示所对应的的Dna对象的代码
    String dnaCode;
    // 表示实例中每一个属性的值
    Map<String,Va> vas = new HashMap<>();
    // 记录每一个孩子Dna对象的实例对象
    Map<String,Inst> children = new HashMap<>();
    // 指向cell对象所在的inst对象
    @JsonIgnore
    Inst owner;

    public void setVaByName(String vdCode, Object value) {
        List<Vd> vds = owner.getDna().getVds();
        Map<String, Vd> map = vds.stream().collect(Collectors.toMap(Vd::getVdCode, e -> e));
        Vd vd = map.get(vdCode);
        Va va = new Va();
        va.setId(IdGenerator.getNextId());
        va.setCode(vd.getVdCode());
        va.setName(vd.getVdName());
        va.setValue(value);
        vas.put(vdCode,va);
    }

    public void addChildInst(String dnaName, String dnaCode, Inst accoutInst) {
        children.put(dnaName,accoutInst);
    }

    public void addChildInst(Inst accoutInst) {
        children.put(accoutInst.getDnaName(),accoutInst);
    }

    @Override
    public String toString() {
        return "Cell{" +
                "id=" + id +
                ", rootId=" + rootId +
                ", parentId=" + parentId +
                ", operationFlag='" + operationFlag + '\'' +
                ", dnaCode='" + dnaCode + '\'' +
                ", vas=" + vas +
                ", children=" + children +
                '}';
    }

    public Inst getChildInst(String childName) {
        return children.get(childName);
    }

    public String getRawStringByName(String name) {
        Va va = vas.get(name);
        if(va != null) {
            return va.getRawString();
        }
        else{
            return null;
        }
    }

    public Integer getRawIntByName(String name) {
        Va va = vas.get(name);
        if(va != null) {
            return va.getRawInt();
        }
        else{
            return null;
        }
    }

    public Va getVaByName(String vdName) {
        return vas.get(vdName);
    }
}
